import asyncio


async def some_async_func():
    await asyncio.sleep(1)
    raise ValueError("这是一个异步异常示例")


async def main():
    try:
        result = await some_async_func()
        print(result)
    except Exception as e:
        print(f"捕获到异常: {e}")


# 使用try...except捕获异步异常
# asyncio.run(main())


async def task1():
    await asyncio.sleep(1)
    return "任务1完成"


async def task2():
    await asyncio.sleep(1)
    return "任务2完成"


async def task3():
    await asyncio.sleep(1)
    raise RuntimeError("任务3发生错误")


async def task4():
    await asyncio.sleep(1)
    return "任务4完成"


async def task5():
    await asyncio.sleep(1)
    return "任务5完成"


async def task6():
    await asyncio.sleep(1)
    raise RuntimeError("任务6发生错误")


"""
asyncio.gather 的异常机制
asyncio.gather 并发执行多个协程。当其中任何一个协程抛出异常时，默认会终止其他协程并传播第一个异常。

但如果将 return_exceptions=True，则所有异常会被包装为异常对象返回，不会中断其他任务。示
"""


async def main_gather():
    tasks = [task1(), task2(), task3(), task4(), task5(), task6()]

    # 将 return_exceptions=True，则所有异常会被包装为异常对象返回，不会中断其他任务
    results = await asyncio.gather(*tasks, return_exceptions=True)

    # results = await asyncio.gather(*tasks, return_exceptions=False)
    for i, result in enumerate(results):
        if isinstance(result, Exception):
            print(f"任务{i+1}捕获到异常: {result}")
        else:
            print(f"任务{i+1}结果: {result}")


# 使用 asyncio.gather 捕获多个异步任务的异常
asyncio.run(main_gather())
